1-1 q{Xp氻kGp

MATLAB 的 tic 和 toc 指令,是最簡單的程式計時方法,只要將整段程式碼置於這兩個指令之中,MATLAB 就會自動計算程式執行所花費的時間。例如:對於一個維度 1000×1000 的亂數矩陣,欲求得其反矩陣的計算時間,可輸入如下:

Example 1: 01-程式計時/tictoc01.mtic % 開始計時 z=inv(rand(1000)); % inv 指令是用來計算反矩陣 toc % 結束計時Elapsed time is 0.190357 seconds.

由上述範例,可以得知MATLAB 花費在執行 inv(rand(1000)) 計算的時間。

Hint
  • tic 和 toc 指令在英文的念法是類似馬錶按下及跳起的聲音,故取此名,夠傳神吧?!
  • 作者執行此程式所使用的電腦是 Intel Core i7、4 GB RAM 的筆電,如果讀者的電腦比作者的等級更高,所得到的時間可能就更短了!

若要使用多個馬錶來計時,則只需要將 tic 指定到一個變數即可,對應的 toc 指令也必須用到此變數,才能記錄此馬錶所花的時間。在下列範例中,我們計算 inv 指令對不同維度的矩陣所花的時間,其中用了兩個馬錶,分別計算總時間以及每個矩陣所花的時間:

Example 2: 01-程式計時/tictoc02.mtimer1=tic; % 馬表一開始計時 n=100*(1:10); for i=1:length(n) timer2=tic; % 馬表二開始計時 z=inv(rand(n(i))); % inv 指令是用來計算反矩陣 time(i)=toc(timer2); % 馬表二停止計時 end fprintf('Overall time = %f sec\n', toc(timer1)); % 馬表一停止計時 plot(n, time, '.-'); xlabel('Matrix dimensions'); ylabel('Elapsed time (in sec)');Overall time = 0.562098 sec

若要取得絕對時間,可以使用 clock 指令來傳回現在的時間所形成的向量,包含 6 個元素,分別是年、月、日、時、分、秒,例如我們可以直接在 MATLAB 視窗輸入如下:

>> round(clock) ans = 2012 2 6 10 58 12

在上例中,傳回的整數向量,代表現在時間是 2012 年 2 月 6 日 10 時 58 分 12 秒,round 指令的作用是將所有傳回數值,加以四捨五入成整數,便於閱讀。

使用 etime 指令則可以傳回兩個時間的差值,並以秒數表示。因此將 clock 和 etime 指令合併使用,就可以計算一段程式碼的執行時間。以前面的例子而言,可改用 clock 和 etime 指令來得到類似的結果:

Example 3: 01-程式計時/etime01.mt0 = clock; % 記錄現在的時間 a = inv(rand(1000)); % 執行反矩陣運算 elapsedTime = etime(clock, t0) % 計算所耗費的總時間 elapsedTime = 0.1490

Hint
etime 就是 elapsed time (經過時間)的簡稱。

另一個相關的指令是 cputime,可傳回 MATLAB 從啟動後所占用的 CPU 時間。但由於 MATLAB 官方文件表示,cputime 會受到 Windows 實作的影響(Pentium 4 with hyperthreading running Windows)而不準確,因此我們目前所學的馬錶計時應該以 tic、toc、clock、etime 這四個指令為主。


MATLAB程式設計:進階篇